package gti310.tp4;
import java.math.*;

/**
 * TODO Description
 * 
 * @author Fredy et Emile
 * @date 2014-11-14
 */
public class ImageConverter {

	private static int[][][] RGB;
	private static double[][][] YCbCr;

	/**
	 * Constructeur de la classe Image converter, reçoit en paramètre un tableau
	 * des données RVB. 
	 * 
	 * @param RGB
	 */
	public ImageConverter(int[][][] RGB)
	{
		this.RGB = RGB;		
	}

	/**
	 * Méthode d'affichage des donnée du array RVB
	 */
	public void showRGB(){		
		for(int rgb=0;rgb<3;rgb++){
			for(int i=0;i<256;i++){
				for(int j=0;j<256;j++){
					System.out.print(RGB[rgb][i][j] + " ");
				}
				System.out.println("\n");
			}
			System.out.println("Fin de component");
		}		
	}
	/**
	 * La méthode RGBtoYCbCr converti les valeurs du tableau RVB en utilisant
	 * les formuless de conversion vers un tableau YCbCr. 
	 *
	 * @param rgb, th array to convert
	 * @return the array YCbCr converted
	 */
	public double[][][] RGBtoYCbCr(){
		YCbCr = new double[3][256][256]; 

		for(int i=0;i<256;i++){
			for(int j=0;j<256;j++){
				int R = RGB[0][i][j];
				int G = RGB[1][i][j];
				int B = RGB[2][i][j];

				//Les valeurs YCbCr 
				double Y = (0.299)*R + (0.587)*G + (0.114*B);
				double Cb =  ((B-Y)/1.772) + 0.5;
				double Cr =  ((R-Y)/1.402) + 0.5;

				YCbCr[0][i][j] = Y;
				YCbCr[1][i][j] = Cb;
				YCbCr[2][i][j] = Cr;
			}			
		}

		return YCbCr;
	}

	/**
	 * Méthode interne faisant appel à la méthode convertReturn. 
	 * 
	 * @param rgb
	 */
	/*
	private void convert(int[][][] rgb)
	{
		this.YCbCr = RGBtoYCbCr(rgb);
	}
	*/
	/**
	 * La méthode YCbCrtoRGB converti les valeurs du tableau YCbCr en utilisant
	 * les formuless de conversion vers un tableau RGB. 
	 * 
	 * @param YCbCr
	 * @return the rgb array
	 */
	public int[][][] YCbCrtoRGB(double[][][] YCbCr){
		
		int [][][] rgb = new int[3][256][256];
		
		for(int i=0;i<256;i++){
			for(int j=0;j<256;j++){
				double y = YCbCr[0][i][j];
				double cb = YCbCr[1][i][j];
				double cr = YCbCr[2][i][j];

				//Les valeurs RGB 
				 int r = (int) (y + 1.40200 * (cr - 0x80));
				 int g = (int) (y - 0.34414 * (cb - 0x80) - 0.71414 * (cr - 0x80));
				 int b = (int) (y + 1.77200 * (cb - 0x80));		
				 
				 /*r = Max(0, Min(255, r));
				 g = Max(0, Min(255, g));
				 b = Max(0, Min(255, b));*/

				 rgb[0][i][j] = r;
				 rgb[1][i][j] = g;
				 rgb[2][i][j] = b;
			}			
		}
		
		return rgb;
	}
}
